/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.model.DAO.Social;

import com.myapp.model.DAO.HibernateUtil;
import com.myapp.model.amigos.Amigos;
import com.myapp.model.mensajes.Mensajes;
import com.myapp.model.usuarios.Usuarios;
import com.myapp.model.DAO.states.EstadosDao;
import com.myapp.model.estados.Estados;
import com.myapp.model.notificaciones.Notificaciones;
import com.myapp.model.tipos.Tipos;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Restrictions;

public class SocialDao {
    /**
     * Metodo para añadir un amigo 
     * @param Amigos a 
     */
    public void addFriend(Amigos a) {
        Usuarios u = a.getUsuariosByIdusuario();
        List<Amigos> amigos = getFriendList(u);
        boolean existe = false;
        for (Amigos la : amigos) {
            int a1 = a.getUsuariosByIdusuario().getIdusuario();
            int a2 = a.getUsuariosByIdamigo().getIdusuario();
            int a3 = la.getUsuariosByIdusuario().getIdusuario();
            int a4 = la.getUsuariosByIdamigo().getIdusuario();
            if (a1 == a3 && a2 == a4 || a1 == a4 && a2 == a3) {
                existe = true;
            }
        }
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {

            if (!existe) {
                //Comenzar la transacción 
                session.beginTransaction();
                session.save(a);
                //Confirmar transacción 
                session.getTransaction().commit();
            }
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }
    /**
     * Metodo que borra a un amigo
     * @param Amigos a 
     */
    public void deleteFriend(Amigos a) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            int id = a.getIdamigos();
            a = (Amigos) session.get(Amigos.class, id);
            session.delete(a);
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }
    /**
     * Metodo que devuelve la lista de amigos de un usuario
     * @param Usuarios u
     * @return List 
     */
    public List<Amigos> getFriendList(Usuarios u) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        List lista = null;
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            //Almacenarlo o actualizarlo
            lista = session.createCriteria(Amigos.class).
                    createAlias("usuariosByIdusuario", "us1", CriteriaSpecification.LEFT_JOIN).
                    createAlias("usuariosByIdamigo", "us2", CriteriaSpecification.LEFT_JOIN).
                    add(Restrictions.disjunction().
                    add(Restrictions.eq("usuariosByIdusuario", u)).
                    add(Restrictions.eq("usuariosByIdamigo", u))).list();
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return lista;
        }
    }

    /**
     * Metodo que lista los usuarios, no muestra los desactivos, al mismo usuario, ni a los administradores
     * @param String busqueda, Usuarios u
     * @return List
     */
    public List<Usuarios> getUserList(String busqueda, Usuarios u) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        List lista = null;
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            String hql = "from Usuarios u where alias like '%" + busqueda + "%' and alias<>'" + u.getAlias() + "' and estado<>1 and estado<>4 order by alias desc";
            //Almacenarlo o actualizarlo
            lista = session.createQuery(hql).list();
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return lista;
        }
    }
    /**
     * Metodo que almacena un mensaje
     * @param Mensajes m 
     */
    public void sendMessage(Mensajes m) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            //Comenzar la transacción 
            session.beginTransaction();
            session.save(m);
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }
    /**
     * Metodo que borra un mensaje
     * @param Mensajes m 
     */
    public void deleteMessage(Mensajes m) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            //Comenzar la transacción 
            session.beginTransaction();
            session.delete(m);
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }
    /**
     * Metodo que muestra un mensaje segun su id
     * @param Mensajes m
     * @return Mensajes 
     */
    public Mensajes readMessage(Mensajes m) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            //Comenzar la transacción 
            session.beginTransaction();
            int id = m.getIdmensaje();
            m = (Mensajes) session.createCriteria(Mensajes.class).
                    createAlias("usuariosByIdremitente", "us", CriteriaSpecification.LEFT_JOIN).
                    add(Restrictions.eq("idmensaje", id)).uniqueResult();
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return m;
        }
    }
    
     /**
     *  Metodo que establece el estado de un mensaje en Reportado
     * @param Mensajes m 
     */
        public void reportMessage(Mensajes m) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        try {
            //Comenzar la transacción 
            session.beginTransaction();
            int id = m.getIdmensaje();
            m = (Mensajes) session.get(Mensajes.class, id);
            Estados e = new Estados();
            e.setIdestado((byte)5);
            m.setEstados(e);
            session.save(m);
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }
    
   /**
    * Metodo que devuelve la lista de mensajes de un Usuario
    * @param Usuarios u
    * @return List 
    */
    public List<Mensajes> getMessageList(Usuarios u) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        List lista = null;
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            lista = session.createCriteria(Mensajes.class).
                    createAlias("usuariosByIdremitente", "us", CriteriaSpecification.LEFT_JOIN).
                    add(Restrictions.eq("usuariosByIddestinatario", u)).list();
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return lista;
        }
    }
}
